package visitlimit

// VisitLink 链接
type VisitLink struct {
	Name        string // 限制名称
	IPRange     string // IP
	PortRange   string // 端口 * 全部限制 空 (链接数量限制)
	TakeEffect  bool   // 是否生效
	LinksNumber uint32 // 限制链接数量 0 无限制
}

// VisitLimit 访问限制
type VisitLimit struct {
	LimitType bool              // 限制类型
	LimitList map[int]VisitLink // 限制列表
}

// Init 限制状态
func (V *VisitLimit) Init() {
	V.LimitType = true
	V.LimitList = make(map[int]VisitLink)
}

// LimitCondition 限制状态
func (V *VisitLimit) LimitCondition(ip string, port string) (bool, func()) {
	for _, visit := range V.LimitList {
		if visit.TakeEffect {
			// Ip端口限制
			if visit.IPRange == ip && visit.PortRange == port {
				return V.LimitType, func() {}
			} else if visit.IPRange == ip && visit.PortRange == "*" {
				return V.LimitType, func() {}
			} else
			// Ip 链接数量限制
			if visit.IPRange == ip && visit.PortRange == "" {
				// 数量自减
				if visit.LinksNumber > 1 {
					visit.LinksNumber--
					// 还原
					return false, func() {
						visit.LinksNumber++
					}
				}
				return V.LimitType, func() {}
			}
		}
	}
	return !V.LimitType, func() {}
}
